package com.sunyard.utils.ftputil;

import com.jcraft.jsch.ChannelSftp;
import com.sunyard.exception.IllegalOperationException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * @ClassName: FileUtils
 * @PackageName: com.sunyard.utils.ftputil
 * @Deescription: 文件下载工具类
 * @Author: zhix.huang
 * @Date: 2020/8/17 13:52
 * @Version: V1.0
 **/
@Slf4j
public class FileUtils {
    /**
     * @return
     * @Method: downloadFileFromFtpOrSftp
     * @Description: 从FTP或者sftp下载文件
     * @author: zhixin.huang
     * @Date: 2020/8/17 13:56
     * @param: [ftpDto]
     * @throw
     **/
    public static String downloadFileFromFtpOrSftp(FTPDto ftpDto) throws Exception {
        log.info("==============>开始下载文件！\n" + ftpDto.toString());
        /**
         * 文件名
         */
        String fileName = ftpDto.getFileName();

        String localFileName = ftpDto.getLocalFileName();

        if (StringUtils.isEmpty(localFileName)) {
            localFileName = fileName;
        }
        /**
         * 远程文件目录
         */
        String filePath = ftpDto.getRemoteFilePath();
        /**
         * 下载到本地目录
         */
        String localSavePath = ftpDto.getLocalFilePath();
        /**
         * 判断本地文件夹是否存，不存在就新建
         */
        File localFile = new File(localSavePath);
        if (!localFile.exists()) {
            localFile.mkdirs();
        }
        /**
         * FTP文件服务器类型
         */
        String ftpType = ftpDto.getFtpType();

        ChannelSftp connect = null;

        FTPUtils ftpUtils = null;

        try {
            switch (ftpType) {
                case FTPDto.FTP_TYPE_SFTP:
                    /**
                     * 下载文件
                     */
                    SFTPUtils sftpUtils = new SFTPUtils();
                    /**
                     * 获取连接
                     */
                    connect = sftpUtils.connect(ftpDto.getHost(), ftpDto.getPort(),
                            ftpDto.getUser(), ftpDto.getPassWord());
                    /**
                     * 下载文件到本地
                     */
                    Boolean b = sftpUtils.downloadFile2(connect, filePath, fileName, localSavePath, localFileName);

                    if (b) {
                        log.info(fileName + "==============>下载文件成功！");
                    } else {
                        log.info(fileName + "==============>下载文件失败！");
                        throw new IllegalOperationException("下载文件失败！");
                    }
                    /**
                     * 退出连接
                     */
                    sftpUtils.disconnect();
                    break;
                case FTPDto.FTP_TYPE_FTP:
                    /**
                     * 获取ftp连接
                     */
                    ftpUtils = new FTPUtils(ftpDto.getHost(), ftpDto.getPort(),
                            ftpDto.getUser(), ftpDto.getPassWord());
                    /**
                     * 登录
                     */
                    ftpUtils.login();
                    /**
                     * 下载文件到指定目录
                     */
                    ftpUtils.downFile(filePath + fileName, localSavePath + localFileName);
                    log.info(fileName + "==============>下载银联对账文件成功！");
                    /**
                     * 登出
                     */
                    ftpUtils.logout();
                    break;
                default:
                    throw new IllegalOperationException("暂不支持该文件服务器类型！");
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (connect != null) {
                connect.getSession().disconnect();
                connect.quit();
                connect.disconnect();
            }

            if (ftpUtils != null) {
                ftpUtils.logout();
            }
        }


        return localSavePath + fileName;
    }

    /**
     * 下载文件时，针对不同浏览器，进行附件名的编码
     *
     * @param filename 下载文件名
     * @param agent    客户端浏览器
     * @return 编码后的下载附件名
     * @throws IOException
     */
    public static String encodeDownloadFilename(String filename, String agent)
            throws IOException {
        if (agent.contains("Firefox")) { // 火狐浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replaceAll("\r\n", "");
        } else { // IE及其他浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        }
        return filename;
    }

}
